<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<!--last modified on Wednesday, October 19, 2016 09:39 AM -->
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
  <TITLE>se2aufg2</TITLE>
  <LINK rel=stylesheet type="text/css" media="screen" href="screen.css">
  <LINK rel=stylesheet type="text/css" media="print" href="print.css">
</HEAD>
<BODY>
<P><FONT SIZE="3">Hochschule Augsburg &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20. 3. 2011<BR>
Fakult&auml;t f&uuml;r  Informatik<BR>
Prof. Meixner</FONT>
<H3> <FONT SIZE="3"><B>Praktikum Programmieren 2 im Studiengang Informatik</B></FONT> </H3>
<P>
<FONT SIZE="3"><B>Aufgabe 2</B></FONT>
<H4>
  1. Teil:
</H4>
<P>
Nachdem die Konto-Klassen hoffentlich ordentlich ausgetestet sind und
einen stabilen Zustand erreicht haben, wollen wir daran gehen, eine Bank
zu implementieren.
<P>
Zun&auml;chst sollen nur Dienste realisiert werden, die Kundenw&uuml;nsche
bedienen, als da sind:
<UL>
  <LI>
    Ein neues Konto anlegen (Giro- oder Festgeldkonto).
  <LI>
    Einen Kontostand abfragen.
  <LI>
    Einen Betrag auf ein Konto einzahlen.
  <LI>
    Einen Betrag von einem Konto abheben.
  <LI>
    Von einem Konto auf ein anderes Konto (bei derselben Bank) eine &Uuml;berweisung
    durchf&uuml;hren.
</UL>
<P>
Definieren Sie ein Interface <CODE>BankKundenSicht</CODE>, in dem f&uuml;r
jede dieser Aktionen eine Methode definiert wird. &Uuml;berlegen Sie genau,
welche &Uuml;bergabeparameter und R&uuml;ckgabewerte die Methoden besitzen
sollen.
<P>
Nun soll das Interface durch die Klasse <CODE>BankImpl </CODE>implementiert werden. Programmieren Sie dazu zun&auml;chst in einer &quot;heilen Welt&quot;, d. h. lassen Sie m&ouml;gliche Fehlerf&auml;lle zuerst au&szlig;en vor. Die Bank muss eine Menge von Konten verwalten. Mangels Kenntnis eines besseren Containers sind wir (noch) dazu gezwungen, daf&uuml;r ein Array zu verwenden. Legen Sie zu diesem Zweck ein Array an (mit einer festen Gr&ouml;&szlig;e, kein schrittweises Vergr&ouml;&szlig;ern erforderlich).<BR>
Um bei gegebener Kontonummer einen effizienten Zugriff auf das zugeh&ouml;rige
Konto zu haben, sollte eine wohldefinierte Abbildung von der Menge der
Kontonummern auf die Menge der Array-Indizes verwendet werden (z. B. der
&nbsp;"ersten" Kontonummer 1000 entspricht der Index 0, der Kontonummer 1001
der Index 1, usw.) <BR>
"Verstecken" Sie dabei das Array aber so, dass sp&auml;ter nur sehr wenig
in Ihrem Code zu &auml;ndern ist, wenn das Array durch einen besseren Container
ersetzt wird (z. B. per Einf&uuml;hren einer Hilfsmethode, die zu einer gegebenen
Kontonummer eine Referenz auf das zugeh&ouml;rige Konto-Objekt
zur&uuml;ckliefert).
<P>
Zus&auml;tzlich zu den Methoden aus dem Interface <code>BankKundenSicht</code> sollen
in der Klasse <code>BankImpl</code> noch zwei weitere Methoden realisiert werden:
<P>
In der Methode <CODE>verzinsen() </CODE>soll &uuml;ber alle Konten gelaufen
werden und deren Verzinsungs-Methode aufgerufen werden.
<P>
Die Methode <CODE>list() </CODE>soll f&uuml;r alle Konten die wesentlichen
Daten auf Stdout ausgeben. Realisieren Sie zu diesem Zweck, falls nicht schon
geschehen, f&uuml;r jede Kontoklasse eine <CODE>toString()</CODE>-Methode.
<P>
Realisieren Sie eine kleine Demo, bei der in einer Main-Methode verschiedene
Bank-Methoden aufgerufen werden und die Wirkung dieser Transaktionen jeweils
auf dem Bildschirm ausgegeben wird. <BR>
Vergeuden Sie aber keine Zeit damit, irgendwelche Eingaben von Stdin abzufragen,
also z. B. Kundendialog in einer DOS-Box. Das werden wir sp&auml;ter zumindest
teilweise &uuml;ber eine graphische Benutzeroberfl&auml;che machen.
<H4>
  2. Teil:</H4>
<P> &Uuml;berlegen Sie nun, an welchen Stellen Ausnahmesituationen entstehen k&ouml;nnen, die durch Exceptions oder geeignete Pr&uuml;fungen abgehandelt werden k&ouml;nnen. Starten Sie damit, dass Sie f&uuml;r den Fall, dass versucht wird von einem Festgeldkonto einen gr&ouml;&szlig;eren Betrag als den Kontostand abzuheben, eine gepr&uuml;fte (checked) Exception einf&uuml;hren. Gehen Sie anschlie&szlig;end ihren Code durch und pr&uuml;fen Sie, wo weitere unerwartete Situationen behandelt werden sollten. F&uuml;hren Sie dabei an mind. einer Stelle eine ungepr&uuml;fte (unchecked) Exception ein und machen Sie sich den Unterschied zwischen beiden Typen von Exceptions noch einmal klar.
<P>Reagieren Sie in der Main-Methode auf die Ausnahmesituationen, die durch eine simulierte falsche Bedienung der Bank hervorgerufen werden (z. B. Versuch zu gro&szlig;en Betrag von Festgeldkonto abzuheben). Provozieren Sie solche Situationen.
<P>Ohne dass dies in Zukunft explizit erw&auml;hnt werden muss, wird davon
ausgegangen, dass neue Klassen immer geeigneten Paketen zugeordnet werden
und Ausnahmesituationen, soweit sinnvoll und erforderlich, mit Exceptions abgedeckt werden.

<H4>3. Teil: </H4>
<P>
In jedem Konto sollen nun in einer Liste die f&uuml;r das Konto aufgelaufenen
Buchungen gemerkt werden. Definieren Sie dazu eine eigene (immutable) Klasse
<CODE>Buchung</CODE>, in der der Buchungstext und der zugeh&ouml;rende Betrag
geeignet als Attribute abgelegt sind (das Buchungsdatum kommt sp&auml;ter
noch hinzu).
<P>
F&uuml;r die Verwaltung der Buchungsobjekte soll eine eigene Klasse
<CODE>Buchungsliste</CODE> erstellt werden, die auf einer einfach verketteten
Liste basiert (vgl. <CODE>CircleStackLinkedListImpl</CODE>).<BR>
Hier soll es eine Methode <CODE>add()</CODE> zum Einf&uuml;gen eines neuen
Buchungsobjekts geben (hinten an die Liste anh&auml;ngen) und eine Methode
<CODE>clear() </CODE>zum L&ouml;schen des Listeninhalts. <BR>
Ferner sollen alle Elemente der Liste durchlaufen werden k&ouml;nnen. Dazu
soll eine Methode <CODE>next()</CODE> implementiert werden, die beginnend
beim ersten Buchungsobjekt in der Liste mit jedem Aufruf ein weiteres
Buchungsobjekt an den Aufrufer liefert (falls keines mehr da ist, wird
<CODE>null</CODE> zur&uuml;ckgegeben). Zum Zur&uuml;cksetzen des Durchlaufs
soll es die Methode <CODE>resetIteration()</CODE> geben. Nach deren Aufruf
wird mit <CODE>next()</CODE> wieder das erste Element in der Liste geliefert.
<P>
Testen Sie die Klasse Buchungsliste zuerst f&uuml;r sich allein aus (eigene
Testklasse mit main()-Methode).
<P>
Bauen Sie anschlie&szlig;end die Buchungsliste f&uuml;r den vorgesehenen
Zweck in das Klassensystem der Bank ein:<BR>
Ersetzen Sie dazu in der Methode <CODE>Konto.verbuchen()</CODE> das
<CODE>System.out.println()</CODE> durch ein <CODE>add()</CODE> bzgl. der
Buchungsliste.<BR>
Als Vorstufe zum Kontoauszugsdruck soll es in der Klasse Konto eine Methode
geben, die in Form eines Strings die Buchungsliste in einfacher Form formatiert
zur&uuml;ckliefert<BR>
In der&nbsp;Bank soll es eine Methode geben, die f&uuml;r eine gegebene
Kontonummer den zugeh&ouml;rigen (vorl&auml;ufigen) Kontoauszug (hier noch
als String) zur&uuml;ckliefert.
<P>
<P>
<P> <B>Abnahme: i. d. R. am 28. bzw. 31. 3., sp&auml;testens am 4. bzw. 6. 4.!</B>
</BODY></HTML>